#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <cstdlib>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 1234
#define MAXDATASIZE 100

int main(){
    int sockfd;//套接字描述符
    struct sockaddr_in server, client;//服务端和客户端的地址结构
    socklen_t len = sizeof(client);//用于描述客户端的长度
    int num;//接收的字节数
    char buf[MAXDATASIZE];//字节缓冲区的最大字节数

    // 创建套接字,返回该套接字的套接字描述符
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
        perror("Creating socket failed!");
        exit(1);
    }
    
    // 清空服务端的地址结构,并向其中填充服务器的地址和端口
    bzero(&server, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr.s_addr = htonl(INADDR_ANY);

    // 将套接字与地址结构绑定
    if(bind(sockfd, (struct sockaddr*) &server, sizeof(server)) == -1){
        perror("bind error");
        exit(1);
    }


    while(1){
        // recvfrom接收数据,并将数据保存到字节缓冲区中,返回接收的字节数,客户端的地址
        num = recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr*) &client, &len);
        if(num < 0){
            perror("recvform error\n");
            exit(1);
        }
        buf[num] = '\0';
        printf("You got a message <%s> from client.\nIts IP is %s, port is %d.\n", buf, inet_ntoa(client.sin_addr), htons(client.sin_port));
        // sendto向客户端发生数据
        sendto(sockfd, "Welcome!\n", 8, 0, (struct sockaddr*) &client, len);
        if(!strcmp(buf, "bye")){
            break;
        }
    }
    close(sockfd);

    return 0;

    
}